#!/bin/bash

# =============================================
# 认证管理系统 (兼容CentOS7/Ubuntu)
# 版本: 2.1
# 修复重点: 用户名引号解析问题
# 维护: your_email@example.com
# =============================================

# 初始化环境
init_env() {
    # 恢复终端设置
    stty sane
    stty erase ^H 2>/dev/null
    
    # 颜色定义
    export RED='\033[0;31m'
    export GREEN='\033[0;32m'
    export YELLOW='\033[0;33m'
    export NC='\033[0m'
}

# 检查root权限
check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "${RED}错误：此脚本必须以 root 权限运行！${NC}"
        echo -e "请使用 ${YELLOW}'sudo -i'${NC} 切换到 root 用户后重试。"
        exit 1
    fi
}

# 加载用户数据 (核心修复函数)
load_users() {
    local user_data_url="https://gitee.com/banban1000/docker/raw/master/dsm/user.txt"
    local temp_file=$(mktemp)
    
    echo -e "${GREEN}正在从远程加载用户数据...${NC}"
    
    # 下载用户数据
    if ! curl --connect-timeout 15 --retry 2 -fsSL "$user_data_url" > "$temp_file"; then
        echo -e "${RED}错误：用户数据下载失败！${NC}"
        rm -f "$temp_file"
        exit 1
    fi

    # 清空原有用户数据
    unset users
    declare -gA users

    # 解析用户数据 (关键修复点)
    while IFS= read -r line; do
        # 移除注释和空格
        line=$(echo "$line" | sed -e 's/#.*$//' -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
        
        # 匹配两种格式并标准化用户名
        if [[ "$line" =~ ^\[([^]]+)\]=\"([^\|]+)\|([^\|]+)\|([0-9]+) ]]; then
            # 核心修复：移除用户名中的所有引号
            local username=$(echo "${BASH_REMATCH[1]}" | tr -d '"'"'")
            local password_hash="${BASH_REMATCH[2]}"
            local create_date="${BASH_REMATCH[3]}"
            local valid_months="${BASH_REMATCH[4]}"
            
            users["$username"]="$password_hash|$create_date|$valid_months"
            echo -e "[加载用户] ${GREEN}$username${NC} (有效期: $valid_months 个月)"
        fi
    done < "$temp_file"

    rm -f "$temp_file"
    echo -e "总计加载用户数: ${GREEN}${#users[@]}${NC}"
}

# 密码有效期检查
check_expiry() {
    local username=$1
    local record="${users[$username]}"
    IFS='|' read -ra parts <<< "$record"
    
    [[ -z "${parts[2]}" || "${parts[2]}" -eq 0 ]] && return 0
    
    local expire_date=$(date -d "${parts[1]} + ${parts[2]} months" +%Y-%m-%d)
    local today=$(date +%Y-%m-%d)
    
    if [[ "$today" > "$expire_date" ]]; then
        echo -e "${RED}密码已过期！请更换密码。${NC}"
        return 1
    else
        echo -e "密码有效期至: ${GREEN}$expire_date${NC}"
        return 0
    fi
}

# 用户登录
user_login() {
    local username password hashed_password
    read -p "请输入用户名: " username
    read -sp "请输入密码: " password
    echo

    # 标准化输入用户名
    username=$(echo "$username" | tr -d '"'"'")

    if [[ -z "${users[$username]}" ]]; then
        echo -e "${RED}错误：用户名 '$username' 不存在！${NC}"
        echo -e "可用用户列表:"
        printf -- '- %s\n' "${!users[@]}"
        return 1
    fi
    
    hashed_password=$(echo -n "$password" | sha256sum | awk '{print $1}')
    if [[ "${users[$username]%%|*}" == "$hashed_password" ]]; then
        if check_expiry "$username"; then
            echo -e "${GREEN}登录成功！${NC}"
            update_config "$username" "$hashed_password"
            return 0
        fi
    else
        echo -e "${RED}密码错误！${NC}"
        return 1
    fi
}

# 更新配置 (保持不变)
update_config() {
    local config_dir="/etc/auth_system"
    mkdir -p "$config_dir"
    
    echo "username=$1" > "$config_dir/dsmuser_config.txt"
    echo "password_hash=$2" >> "$config_dir/dsmuser_config.txt"
    echo "create_date=${users[$1]#*|}" >> "$config_dir/dsmuser_config.txt"
}

# 主菜单 (保持不变)
show_menu() {
    clear
    echo "========================"
    echo "  系统管理菜单"
    echo "========================"
    echo "1. Docker 更新守护进程"
    echo "2. SSL证书 更新证书"
    echo "3. ddns-go 域名解析"
    echo "4. 退出"
    echo "========================"
}

# 执行操作 (保持不变)
run_command() {
    case $1 in
        1) bash -c "$(curl -fsSL https://gitee.com/banban1000/docker/raw/master/dsm/rewrite_daemen.sh)";;
        2) bash -c "$(curl -fsSL https://gitee.com/banban1000/docker/raw/master/dsm/dsmupcert.sh)";;
        3) bash -c "$(curl -sSLf https://gitee.com/banban1000/docker/raw/master/linux/docker-install-ddnsgo.sh)";;
        4) exit 0;;
        *) echo -e "${RED}无效选项！${NC}";;
    esac
    read -n 1 -s -r -p "按任意键继续..."
}

# 主程序流程
main() {
    init_env
    check_root
    load_users
    
    # 检查现有配置
    if [[ -f "/etc/auth_system/dsmuser_config.txt" ]]; then
        local saved_user=$(awk -F= '/username/{print $2}' /etc/auth_system/dsmuser_config.txt)
        if [[ -n "${users[$saved_user]}" ]]; then
            echo -e "${GREEN}检测到已保存的登录凭据，跳过验证。${NC}"
        else
            until user_login; do : ; done
        fi
    else
        until user_login; do : ; done
    fi

    # 主循环
    while true; do
        show_menu
        read -p "请输入选项编号: " choice
        run_command "$choice"
    done
}

# 启动程序
main "$@"